﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using vudu.Logica.Clases;

namespace vudu.EnlaceDatos.SqlServer
{
    public class SqlServerMateria
    {
        Conexion conex = new Conexion();

        public List<Materia> ConsultarTodasLasMaterias()
        {
            List<Materia> lista = new List<Materia>();

            SqlCommand command = new SqlCommand();

            conex.AbrirConexionBd();
            command.Connection = conex.ObjetoConexion();
            command.CommandType = System.Data.CommandType.Text;
            command.CommandText = "SELECT * FROM MATERIA";
            command.CommandTimeout = 10;

            SqlDataReader reader = command.ExecuteReader();

            while (reader.Read())
            {
                // ver quizas se puede caer aqui por si hay alguna mala asignacion con los getint32
                Materia mat = new Materia();
                mat.Codigo = reader.GetInt32(0);
                mat.Descripcion = reader["descripcion"].ToString();
                mat.Nombre = reader["nombreMateria"].ToString();
                mat.HorasTeoria = reader.GetInt32(2);
                mat.HorasPractica = reader.GetInt32(3);
                mat.Estatus = reader["statusMateria"].ToString();

                lista.Add(mat);
            }
            reader.Close();
            conex.CerrarConexionBd();
            if (lista.ElementAt(0).Nombre == null)
            {
                return null;
            }
            else
                return lista;
        }

        public Materia ConsultarMateria(String codigo, int tipoConsulta)
        {
            Materia materia = new Materia();
            SqlCommand command = new SqlCommand();
            command.Connection = conex.ObjetoConexion();
            command.CommandType = System.Data.CommandType.Text;
            if (tipoConsulta == 1)
                command.CommandText = "SELECT * FROM MATERIA M WHERE M.nombreMateria = '" + codigo + "'";
            else if (tipoConsulta == 2)
                command.CommandText = "SELECT * FROM MATERIA M WHERE M.id_Materia = " + codigo;
            else
                return null;
            command.CommandTimeout = 10;
            try
            {
                conex.AbrirConexionBd();
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    // ver quizas se puede caer aqui por si hay alguna mala asignacion con los getint32
                    Materia materiaConsultada = new Materia();
                    materiaConsultada.Codigo = reader.GetInt32(0);
                    materiaConsultada.Descripcion = reader["descripcion"].ToString();
                    materiaConsultada.Nombre = reader["nombreMateria"].ToString();
                    materiaConsultada.HorasTeoria = reader.GetInt32(2);
                    materiaConsultada.HorasPractica = reader.GetInt32(3);
                    materiaConsultada.Estatus = reader["statusMateria"].ToString();
                    materia = materiaConsultada;
                }
                reader.Close();
                if (materia.Nombre == null)
                    return null;
                else
                    return materia;
            }
            catch (SqlException ex)
            {
                return null;
            }
            catch (Exception ex)
            {
                return null;
            }
            finally
            {
                conex.CerrarConexionBd();
            }
        }

        public bool AgregarMateria(Materia materia)
        {
            SqlCommand comando = new SqlCommand();
            String sql = "INSERT INTO MATERIA(nombreMateria,horasTeoria,horasPractica,descripcion,statusMateria) ";
            sql = sql + "VALUES ('" + materia.Nombre + "'," + materia.HorasTeoria + "," + materia.HorasPractica + ",'" + materia.Descripcion + "','" + materia.Estatus + "')";
            comando.CommandText = sql;
            comando.Connection = conex.ObjetoConexion();
            try
            {
                conex.AbrirConexionBd();
                comando.ExecuteNonQuery();
                return true;
            }
            catch (SqlException ex)
            {
                return false;
            }
            catch (Exception ex)
            {
                return false;
            }
            finally
            {
                conex.CerrarConexionBd();
            }
        }

        public int EliminarMateria(Materia materia)
        {
            SqlCommand comando = new SqlCommand();
            String sql = "DELETE FROM MATERIA WHERE ID_MATERIA = " + materia.Codigo;
            comando.CommandText = sql;
            comando.Connection = conex.ObjetoConexion();
            try
            {
                conex.AbrirConexionBd();
                comando.ExecuteNonQuery();
                return 1;
            }
            catch (SqlException ex)
            {
                List<SeccionMateria> seccion = new SqlServerSeccionMateria().ConsultarSeccionesDeUnaMateria(materia);
                if (seccion != null)
                {
                    return 2;
                }
                else
                    return 0;
            }
            catch (Exception ex)
            {
                return 0;
            }
            finally
            {
                conex.CerrarConexionBd();
            }
        }

        public bool ModificarMateria(List<String[]> campos, Materia materia)
        {
            SqlCommand comando = new SqlCommand();
            String sql = null;
            bool estatusModificacion = false;
            foreach (String[] c in campos)
            {
                String campo = c[1];
                String valor = c[2];
                if (campo.Contains("Nombre"))
                {
                    sql = "update materia set nombreMateria = '" + valor + "' where id_Materia = " + materia.Codigo;
                }
                else if (campo.Contains("Teoria"))
                {
                    sql = "update materia set horasTeoria = " + valor + " where id_Materia = " + materia.Codigo;
                }
                else if (campo.Contains("Practica"))
                {
                    sql = "update materia set horasPractica = " + valor + " where id_Materia = " + materia.Codigo;
                }
                else if (campo.Contains("Descripcion"))
                {
                    sql = "update materia set descripcion = '" + valor + "' where id_Materia = " + materia.Codigo;
                }
                else if (campo.Contains("Estatus"))
                {
                    sql = "update materia set statusMateria = '" + valor + "' where id_Materia = " + materia.Codigo;
                }
                if (sql == null)
                {
                    estatusModificacion = false;
                }
                else
                {
                    comando.CommandText = sql;
                    comando.Connection = conex.ObjetoConexion();
                    try
                    {
                        conex.AbrirConexionBd();
                        comando.ExecuteNonQuery();
                        estatusModificacion = true;
                    }
                    catch (SqlException)
                    {
                        estatusModificacion = false;
                    }
                    catch (Exception)
                    {
                        estatusModificacion = false;
                    }
                    finally
                    {
                        conex.CerrarConexionBd();
                    }
                }
                if (estatusModificacion == false)
                {
                    return estatusModificacion;
                }
            }
            return estatusModificacion;
        }
    }
}